home *** CD-ROM | disk | FTP | other *** search
- ;****************************************************************************************
- ; Programa DS1821.ASM Fecha : 21/Agosto/2000 *
- ; *
- ; Este programa lee la temperatura de un sensor DS1821 *
- ; y lo muestra en un display de 7 segmentos *
- ; Eugenio Martφn Cuenca y JosΘ Marφa Moreno Balboa *
- ; *
- ; Revisi≤n : 0.0 Programa para PIC16C84 y PIC16F84 *
- ; Velocidad del Reloj: 4 MHz Reloj Instrucci≤n: 1 MHz = 1 S *
- ; Perro Guardißn : deshabilitado Tipo de Reloj : XT *
- ; Protecci≤n del c≤digo : OFF *
- ;************* IGUALDADES ***************************************************************
- ; ********** Igualdades que designa los destinos ****************************************
- w EQU 0 ; El resultado se guarda en w
- f EQU 1 ; El resultado se guarda en el registro
- ; *********** Igualdades de la CPU y del mapa de memoria ********************
- PORTA EQU 05h ; Puerta A
- PORTB EQU 06h ; Puerta B
- TRISA EQU 05h ; Registro Triestado Puerta A
- TRISB EQU 06h ; Registro Triestado Puerta B
- STATUS EQU 03h ; Registro Status
- PCL EQU 02h ; direcci≤n del registro PCL
- ;bits del registro STATUS
- C EQU 00h
- DC EQU 01h
- Z EQU 02h
- RP0 EQU 05h
- RP1 EQU 06h
- IRP EQU 07h
- ; *********** Constantes del Programa
- CERO EQU 0beh
- UNO EQU 00ch
- DOS EQU 076h
- TRES EQU 05eh
- CUATRO EQU 0cch
- CINCO EQU 0DAh
- SEIS EQU 0F8h
- SIETE EQU 00Eh
- OCHO EQU 0FEh
- NUEVE EQU 0CEh
- MENOS EQU 040h
- PIN_DATOS EQU 00h
- ;****************************************************************************************
- ; Variables del programa *
- ;****************************************************************************************
- ORG 0Ch
- bContador1 res 1 ; Registro utilizado en el retardo
- bContador2 res 1 ; Registro utilizado en el retardo
- bContador3 res 1 ; Registro utilizado en el retardo
- bTemporal res 1 ; Almacenamiento temporal
- bDigito1 res 1 ; Almacena el dφgito 1
- bDigito2 res 1 ; Almacena el dφgito 2
- bDigito3 res 1 ; Almacena el dφgito 3
- bTemperatura res 1 ; Almacema el valor de la temperatura
- bTemperaturaTmp res 1 ; Almacema el valor de la temperatura
- bByteSalidaDS res 1 ; Almacema el valor de salida para DS1821
- bByteEntradaDS res 1 ; Almacema el valor de salida para DS1821
-
- ; ***************************************************************************************
- ; * Inicializaci≤n *
- ; ***************************************************************************************
- ORG 00h ; Direcci≤n del vector de Reset
- GOTO lblInicio ; Comienza el programa despuΘs
- ; del vector de interrupci≤n
-
- ORG 05h ; Una posici≤n detras vector Interrupci≤n
- lblInicio
- BSF STATUS,RP0 ; Selecciona la pßgina 1 de la memoria
- CLRF TRISB ; Programa Puerto B como salida
- CLRF TRISA ; Programa Puerto A como salida
- BCF STATUS,RP0 ; Vuelve a la pßgina 0
-
- CLRF PORTA ; Ponemos a cero PuertoA
- CLRF TRISA ; Puerto A como salida
-
- CALL subDS1821ConDev ; Configurar dispositivo para
- ; incio del funcionamiento.
- ;****************************************************************************************
- ;* Bucle Principal del Programa *
- ;****************************************************************************************
- lblBucle CLRF bDigito1 ; Borramos el contenido del Dφgito 1
- CLRF bDigito2 ; Borramos el contenido del Dφgito 2
- CLRF bDigito3 ; Borramos el contenido del Dφgito 3
-
- CALL subDS1821StaConv; Iniciamos la conversi≤n
-
- CALL subDS1821LeeTem ; Leemos el valor de la temperatura
-
- MOVWF bTemperatura
- CALL subDS1821StoConv; Paramos la conversi≤n
-
- CALL subConvierteTemp; Hacemos la conversi≤n de binario a BCD
- CALL subMuestra ; Mostramos en los displays la temperatura
-
- GOTO lblBucle ; Iniciamos la secuencia otra vez
-
- ;************************************************************************************************
- ; Subrutina: subRetardo10us ---> Produce un retardo de n * 10 us *
- ;entrada w -> multiplos de 10us de retardo *
- ;salida nada *
- ;variables utilizadas: bContador1 -> contador *
- ;************************************************************************************************
- subRetardo10us MOVWF bContador1
- lblRetardo10us NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- DECFSZ bContador1 , f
- GOTO lblRetardo10us
- RETURN
- ;************************************************************************************************
- ;Subrutina: subRetardoNms ---> Produce un retardo de n * 1ms *
- ;entrada w -> multiplos de 1ms de retardo *
- ;salida nada *
- ;variables utilizadas: bContador1 -> contador *
- ; bContador2 -> contador *
- ;************************************************************************************************
- subRetardoNms MOVWF bContador2
- lblRetardoNms1 MOVLW .110
- MOVWF bContador1
- lblRetardoNms2 NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- DECFSZ bContador1, f
- GOTO lblRetardoNms2
- DECFSZ bContador2, F
- GOTO lblRetardoNms1
- RETURN
- ; ***********************************************************************************************
- ; Subrutina: subDigito ---> Coloca en el acumulador el Valor de los 7 segmentos *
- ; *
- ; Entrada: w -> Dφgito mostrar *
- ; Salida: w -> Representaci≤n del dφgito *
- ; ***********************************************************************************************
- subDigito ADDWF PCL,f ; suma al contador bajo de programa el acmulador
- RETLW CERO ; sale y guarda en w el c≤digo del cero
- RETLW UNO ; sale y guarda en w el c≤digo del uno
- RETLW DOS ; sale y guarda en w el c≤digo del dos
- RETLW TRES ; sale y guarda en w el c≤digo del tres
- RETLW CUATRO ; sale y guarda en w el c≤digo del cuatro
- RETLW CINCO ; sale y guarda en w el c≤digo del cinco
- RETLW SEIS ; sale y guarda en w el c≤digo del seis
- RETLW SIETE ; sale y guarda en w el c≤digo del siete
- RETLW OCHO ; sale y guarda en w el c≤digo del ocho
- RETLW NUEVE ; sale y guarda en w el c≤digo del nueve
- RETLW MENOS ; sale y guarda en w el c≤digo del nueve
- ; ***********************************************************************************************
- ; Subrutina: subDS1821Pin1 ---- > Coloca a uno el bit de salida para el DS1821 *
- ; *
- ; Entrada: nada *
- ; Salida: nada *
- ; ***********************************************************************************************
- subDS1821Pin1 BSF STATUS , RP0
- BSF TRISB , PIN_DATOS ; Colocamos la lφnea en alta impedancia
- BCF STATUS , RP0
- RETURN
- ; ***********************************************************************************************
- ; Subrutina: subDS1821Pin0 ---> Coloca a cero el bit de salida para el DS1821 *
- ; *
- ; Entrada: nada *
- ; Salida: nada *
- ; ***********************************************************************************************
- subDS1821Pin0 BCF PORTB , PIN_DATOS
- BSF STATUS , RP0
- BCF TRISB , PIN_DATOS ; Colocamos la lφnea a cero
- BCF STATUS , RP0
- RETURN
- ; ***********************************************************************************************
- ; Subrutina: subDS1821Init ---> Ejecuta la instrucci≤n de inicio para el dispositivo DS1821 *
- ; *
- ; Entrada: nada *
- ; Salida: nada *
- ; ***********************************************************************************************
- subDS1821Init CALL subDS1821Pin1
- CALL subDS1821Pin0
- MOVLW .50 ; 500 us de retardo
- CALL subRetardo10us
- CALL subDS1821Pin1
- MOVLW .50 ; 500 us de retardo
- CALL subRetardo10us
- RETURN
- ; ***********************************************************************************************
- ; Subrutina: subDS1821ConDev ---> Ejecuta la instrucci≤n de configuraci≤n del DS1821 *
- ; *
- ; Entrada: nada *
- ; Salida: nada *
- ; ***********************************************************************************************
- subDS1821ConDev CALL subDS1821Init
-
- MOVLW 0CH
- MOVWF bByteSalidaDS
- CALL subDS1821ByteOut ; Configura al dispositivo ds1821 modo
- MOVLW 03H ; 1 hilo (1-Wire) y activa polaridad = 1
- MOVWF bByteSalidaDS
- CALL subDS1821ByteOut
- MOVLW .20
- CALL subRetardoNms
- RETURN
- ; ***********************************************************************************************
- ; Subrutina: subDS1821StaConv ---> Ejecuta instrucci≤n de inicio de conversi≤n del DS1821 *
- ; *
- ; Entrada: nada *
- ; Salida: nada *
- ; ***********************************************************************************************
- subDS1821StaConv CALL subDS1821Init
- MOVLW 0EEH
- MOVWF bByteSalidaDS
- CALL subDS1821ByteOut
- MOVLW .5 ; delay for 100 msec para conversi≤n
- CALL subRetardoNms
- RETURN
- ; ***********************************************************************************************
- ; Subrutina: subDS1821LeeTem ---> Ejecuta instrucci≤n de lectura de la temperatura del DS1821 *
- ; *
- ; Entrada: nada *
- ; Salida: w -> Temperatura *
- ; ***********************************************************************************************
- subDS1821LeeTem CALL subDS1821Init
- MOVLW 0AAH
- MOVWF bByteSalidaDS
- CALL subDS1821ByteOut
- CALL subDS1821ByteIn
- MOVF bByteEntradaDS , w
- RETURN
- ; ***********************************************************************************************
- ; Subrutina: subDS1821StoConv ---> Ejecuta la instrucci≤n parada de la conversi≤n del DS1821 *
- ; *
- ; Entrada: nada *
- ; Salida: nada *
- ; ***********************************************************************************************
- subDS1821StoConv CALL subDS1821Init
- MOVLW 22H
- MOVWF bByteSalidaDS
- CALL subDS1821ByteOut
- RETURN
- ; ***********************************************************************************************
- ; Subrutina: subDS1821ByteIn ---> Lee un byte en el DS1821 *
- ; *
- ; Entrada: nada *
- ; Salida: nada *
- ;variables utilizadas: bContador3 -> contador *
- ; ***********************************************************************************************
- subDS1821ByteIn MOVLW .8 ; El valor a leer del dispositivo DS1821
- MOVWF bContador3 ; es un byte, que estß compuesto por 8 bits
- CLRF bByteEntradaDS
- lblDS1821Byte CALL subDS1821Pin0 ; Realizamos un ciclo de lectura, los ciclos de
- NOP ; lectura estßn sincronizados por tiempo
- CALL subDS1821Pin1
- NOP
- NOP
- NOP
- NOP
- NOP
- NOP
- MOVF PORTB , w
- MOVWF bTemporal
- BTFSS bTemporal , PIN_DATOS ; Dependiendo del valor del bit 0
- BCF STATUS , C ; de PortB donde se conecta el DS1821
- BTFSC bTemporal , PIN_DATOS ; se interpreta que la lectura es un
- BSF STATUS , C ; uno ≤ un cero
- RRF bByteEntradaDS , f
- MOVLW .6
- CALL subRetardo10us
- DECFSZ bContador3 , f ; Leemos los 8 bits del byte mandados por
- GOTO lblDS1821Byte ; el dispositivo ds1821
- MOVFW bByteEntradaDS
- RETURN
- ; ***********************************************************************************************
- ; Subrutina: subDS1821ByteOut ---> Escribe un byte del DS1821 *
- ; *
- ; Entrada: nada *
- ; Salida: nada *
- ;variables utilizadas: bContador3 -> contador *
- ; ***********************************************************************************************
- subDS1821ByteOut MOVLW .8 ; El valor a mandar al DS1821 es un byte
- MOVWF bContador3 ; que estß compuesto por 8 bits
- lblDS1821ByteOut3 RRF bByteSalidaDS , f ; Dependiendo del valor del bit de datos
- BTFSS STATUS , C ; se saca por lφnea de datos 1 ≤ un 0
- GOTO lblDS1821ByteOut0
- GOTO lblDS1821ByteOut1
- lblDS1821ByteOut2 DECFSZ bContador3 , f ; Continuamos la operaci≤n hasta que
- GOTO lblDS1821ByteOut3 ; saquemos los 8 bits
- RETURN
-
- lblDS1821ByteOut0 CALL subDS1821Pin0 ; Sacamos por la lφnea de datos
- MOVLW .6 ; el valor de un bit 0
- CALL subRetardo10us
- CALL subDS1821Pin1
- GOTO lblDS1821ByteOut2
-
- lblDS1821ByteOut1 CALL subDS1821Pin0 ; Sacamos por la lφnea de datos
- CALL subDS1821Pin1 ; el valor de un bit 1
- MOVLW .6
- CALL subRetardo10us
- GOTO lblDS1821ByteOut2
- ; ***********************************************************************************************
- ; Subrutina: subConvierteTemp ---> Pasa de un valor binario con signo a un valor BCD con signo *
- ; *
- ; Entrada: bTemperatura -> Temperatura a convertir *
- ; Salida: bDigito1 -> Dφgito menos significativo *
- ; bDigito2 -> *
- ; bDigito3 -> Dφgito mßs significativo y signo si la T¬ es negativa *
- ; ***********************************************************************************************
- subConvierteTemp BTFSS bTemperatura , 7 ; Vemos si se trata de un n·mero negativo
- GOTO lblConversion ; Se trata de un n·mero positivo e
- ; iniciamos la comversi≤n
-
- MOVLW 0ah ; Carga en w la representaci≤n del
- ; signo menos (-)
- MOVWF bDigito3 ; Guarda el valor para el dφgito mßs
- ; significativo
-
- COMF bTemperatura , f ; Complementamos valor de la temperatura
- INCF bTemperatura , f ; Sumamos la unidad, estas operaciones
- ; calculan el complemento a dos
- lblConversion MOVF bTemperatura , w ; Guarda el valor actual de temperatura
- MOVWF bTemperaturaTmp ;
-
- MOVLW 0Ah ; Resta 10 al valor actual de temperatura
- SUBWF bTemperatura , f ; si es menor que 0 hemos llegado a las
- ; unidades
- BTFSS STATUS , C ;
- GOTO lblFinConversion ;
-
- INCF bDigito2 , f ;
- MOVF bDigito2 , w ; Pasamos el valor del dφgito 1 a W
- SUBLW 0Ah ; Resta a W el valor 10 para saber si
- BTFSS STATUS , Z ; se deben actualizar las decenas
- GOTO lblConversion
-
- CLRF bDigito2 ; Borramos el dφgito de las centenas
- INCF bDigito3 , f ; Actualizamos el valor de las decenas
- GOTO lblConversion
-
- lblFinConversion MOVF bTemperaturaTmp , w ; Coloca el valor de las unidades en el
- ; dφgito 1
- MOVWF bDigito1 ;
-
- RETURN
- ; ***********************************************************************************************
- ; Subrutina: subMuestra ---> Muestra la temperatura en los displays de 7 segmentos *
- ; *
- ; Entrada: w -> Dφgito mostrar *
- ; Salida: w -> Representaci≤n del dφgito *
- ; ***********************************************************************************************
- subMuestra MOVF bDigito1 , w ; Valor del dφgito1 a W
- CALL subDigito ; Hacemos la conversi≤n
- MOVWF PORTB ; Mostramos el valor del dφgito
- BSF PORTA , 1 ; Encendemos el Dφgito 1
-
- MOVLW .3 ; Retardo de 3ms
- CALL subRetardoNms
-
- BCF PORTA , 1 ; Apagamos el dφgito 1
- MOVF bDigito2 , w ; Valor del dφgito2 a W
- CALL subDigito ; Hacemos la conversi≤n
- MOVWF PORTB ; Mostramos el valor del dφgito
- BSF PORTA , 2 ; Encendemos el Dφgito 2
-
- MOVLW .3 ; Retardo de 3ms
- CALL subRetardoNms
-
- BCF PORTA , 2 ; Apagamos el dφgito 2
- MOVF bDigito3 , w ; Valor del dφgito3 a W
- CALL subDigito ; Hacemos la conversi≤n
- MOVWF PORTB ; Mostramos el valor del dφgito
- BSF PORTA , 3 ; Encendemos el Dφgito 3
-
- MOVLW .3 ; Retardo de 3ms
- CALL subRetardoNms
-
- BCF PORTA , 3 ; Apagamos el dφgito 3
-
- RETURN
-
- END
-